package cn.biplam.front.component.data.tree.treebase;

import cn.biplam.common.tools.TOOLS;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;
import cn.biplam.front.component.data.tree.treebase.Tree_Type.Tree_NodeType_Commen;
import cn.biplam.front.component.data.tree.treebase.Tree_Type.Tree_PicType;
import cn.biplam.front.component.data.tree.treebase.Tree_Type.Tree_PlusMinus_PicType;
import cn.biplam.front.component.data.tree.treebase.img.PlusMinus;
import cn.biplam.front.component.data.tree.treebase.img.TreeCallBackImgBlue;
import cn.biplam.front.component.data.tree.treebase.img.TreeCallBackImgWindows;

/**
 * 树节点图片处理
 * @author WangSong 2009-11-11下午07:37:56
 * @version 1.0
 */
public abstract class TreeCallBackImg {
	
	/** 虚根名称*/
	protected String picVirName = "duf.gif";
	/** 根主题节点图片-有下级*/
	protected String picThemeHaveChild = "duf.gif";
	/** 根主题节点图片-无下级*/
	protected String picThemeNotHaveChild = "dufl.gif";
	/** 子主题节点图片-有下级*/
	protected String picSubThemeHaveChild = "duf.gif";
	/** 子主题节点图片-无下级*/
	protected String picSubThemeNotHaveChild = "dufl.gif";
	/** 叶子节点图片*/
	protected String picLeaf = "df.gif";
	/** 默认节点图片*/
	protected String picDefault = "leaf.gif";
	/** 图片设置*/
	protected KvMap<String,String> picNames;
	/** 有下级标志*/
	private String haveChild = "h";
	/** 无下级标志*/
	private String notHaveChild = "n";
	/** 加减号图片*/
	protected PlusMinus pm;
	
	/**
	 * 构造方法
	 */
	public TreeCallBackImg(){
		picNames = new KvMap<String, String>();
	}
	
	/**
	 * 根据实现类类型取实现类实例
	 * @param picType 实现类的类型
	 * @return 实现类实例
	 * @throws ErrorMessage
	 */
	public static TreeCallBackImg getInstanct(Tree_PicType picType) throws ErrorMessage{
		if(Tree_PicType.Blue.equals(picType)){
			return new TreeCallBackImgBlue();
		}else if(Tree_PicType.Windows.equals(picType)){
			return new TreeCallBackImgWindows();
		}else{
			throw new ErrorMessage("TreeCallBackImag Error,picType is not found:"+ picType);
		}
	}
	
	/**
	 * 设置根主题图片-有下级
	 * @param picName 有下级节点的根主题图片名称
	 */
	public void setPicRootThemeHaveChild(String picName){
		this.picThemeHaveChild = picName;
	}
	
	/**
	 * 设置根主题图片-有下级
	 * @param picName 有下级节点的根主题图片名称
	 * @param nodeType 节点类型.此节点类型的节点显示当前设置的图片,用于设置同一操作类型节点(operatorType)的不同图片显示
	 * @throws ErrorMessage 
	 */
	public void setPicRootThemeHaveChild(String picName,String nodeType) throws ErrorMessage{
		this.picNames.put(getKey(Tree_NodeType_Commen.RootTheme.toString(), nodeType,true), picName);
	}
	
	/**
	 * 设置根主题图片-无下级
	 * @param picName 有下级节点的根主题图片名称
	 */
	public void setPicRootThemeNotHaveChild(String picName){
		this.picThemeNotHaveChild = picName;
	}
	
	/**
	 * 设置根主题图片-无下级
	 * @param picName 无下级节点的根主题图片名称
	 * @param nodeType 节点类型.此节点类型的节点显示当前设置的图片,用于设置同一操作类型节点(operatorType)的不同图片显示
	 * @throws ErrorMessage
	 */
	public void setPicRootThemeNotHaveChild(String picName,String nodeType) throws ErrorMessage{
		this.picNames.put(getKey(Tree_NodeType_Commen.RootTheme.toString(), nodeType,false), picName);
	}
	
	/**
	 * 设置子主题图片-有下级
	 * @param picName 有下级节点的子主题图片名称
	 */
	public void setPicSubThemeHaveChild(String picName){
		this.picSubThemeHaveChild = picName;
	}
	
	/**
	 * 设置子主题图片-有下级
	 * @param picName 有下级节点的子主题图片名称
	 * @param nodeType 节点类型.此节点类型的节点显示当前设置的图片,用于设置同一操作类型节点(operatorType)的不同图片显示
	 * @throws ErrorMessage 
	 */
	public void setPicSubThemeHaveChild(String picName,String nodeType) throws ErrorMessage{
		this.picNames.put(getKey(Tree_NodeType_Commen.SubTheme.toString(), nodeType,true), picName);
	}
	
	/**
	 * 设置子主题图片-无下级
	 * @param picName 有下级节点的根主题图片名称
	 */
	public void setPicSubThemeNotHaveChild(String picName){
		this.picSubThemeNotHaveChild = picName;
	}
	
	/**
	 * 设置子主题图片-无下级
	 * @param picName 无下级节点的子主题图片名称
	 * @param nodeType 节点类型.此节点类型的节点显示当前设置的图片,用于设置同一操作类型节点(operatorType)的不同图片显示
	 * @throws ErrorMessage
	 */
	public void setPicSubThemeNotHaveChild(String picName,String nodeType) throws ErrorMessage{
		this.picNames.put(getKey(Tree_NodeType_Commen.SubTheme.toString(), nodeType,false), picName);
	}
	
	/**
	 * 设置叶子节点的图片
	 * @param picName 设置叶子图片文件名
	 */
	public void setPicLeaf(String picName){
		this.picLeaf = picName;
	}
	
	/**
	 * 设置叶子节点的图片
	 * @param picName 叶子节点图片名称
	 * @param nodeType 节点类型。此节点类型的节点显示当前设置的图片,用于设置同一操作类型节点的不同图片显示
	 * @throws ErrorMessage 
	 */
	public void setPicLeaf(String picName,String nodeType) throws ErrorMessage{
		this.picNames.put(getKey(Tree_NodeType_Commen.Leaf.toString(), nodeType,false), picName);
	}
	
	/**
	 * 设置自定义操作类型节点的图片
	 * @param picName 图片名称
	 * @param operatorType 节点操作类型
	 * @throws ErrorMessage
	 */
	public void setCustomer(String picName,String operatorType) throws ErrorMessage{
		setCustomer(picName, operatorType, null);
	}
	
	/**
	 * 设置自定义操作类型节点的图片
	 * @param picName 图片名称
	 * @param operatorType 节点操作类型
	 * @param nodeType 节点类型,用于设置同一操作类型节点的不同图片显示
	 * @throws ErrorMessage
	 */
	public void setCustomer(String picName,String operatorType,String nodeType) throws ErrorMessage{
		this.picNames.put(getKey(operatorType, nodeType,false), picName);
	}
	
	/**
	 * 设置加减号图片
	 * @param pmType 图片类型 
	 */
	public void setPlusMinus(Tree_PlusMinus_PicType pmType){
		pm = new PlusMinus(pmType);
	}
	
	/**
	 * 设置加减号图片
	 * @param pmType 图片类型 
	 */
	public void setPlusMinus(PlusMinus mPlusMinus){
		pm = mPlusMinus;
	}
	
	
	/**
	 * 取树节点的显示图片
	 * @param operatorType 节点操作类型
	 * @param nodeType 节点类型(对应node_desc字段)
	 * @param isLeaf 是否是叶子节点
	 * @return 节点图片名称
	 */
	public String get(String operatorType, 
					  String nodeType,
            		  boolean isLeaf) throws ErrorMessage{
		if(Tree_NodeType_Commen.Leaf.toString().equals(operatorType)){
			/**非主题图片*/
			return getNodePicLeaf(nodeType,isLeaf);
		}else if(Tree_NodeType_Commen.RootTheme.toString().equals(operatorType)){
			/**根主题的图片*/
			return getNodePicTheme(nodeType,isLeaf);
		}else if(Tree_NodeType_Commen.SubTheme.toString().equals(operatorType)){
			/**非根主题图片*/
			return getNodePicSubTheme(nodeType,isLeaf);
		}else{
			return getDefault(operatorType,nodeType,isLeaf);
		}
	}
	
	/**
	 * 加减号图片
	 * @return
	 */
	public PlusMinus getPicPlusMinus(){
		return pm;
	}
	
	/**
	 * 取虚根图片
	 * @return 虚根图片
	 */
	public String getVir(){
		return picVirName;
	}
	
	/**
	 * 取根主题图片
	 * @return String 根主题图片名称
	 */
	private String getNodePicTheme(String nodeType,boolean isLeaf){
		String picName = null;
		if(isLeaf){
			picName = getPicName(Tree_NodeType_Commen.RootTheme.toString(), nodeType, false);
			if(picName==null){
				picName = this.picThemeNotHaveChild;
			}
			
		}else{
			picName = getPicName(Tree_NodeType_Commen.RootTheme.toString(), nodeType, true);
			if(picName==null){
				picName = this.picThemeHaveChild;
			}
		}
		return picName;
	}
	
	/**
	 * 取非根主题的图片
	 * @return String 根主题和非根主题的图片名称
	 */
	private String getNodePicSubTheme(String nodeType,boolean isLeaf){
		String picName = null;
		if(isLeaf){
			picName = getPicName(Tree_NodeType_Commen.SubTheme.toString(), nodeType, false);
			if(picName==null){
				picName = this.picSubThemeNotHaveChild;
			}
		}else{
			picName = getPicName(Tree_NodeType_Commen.SubTheme.toString(), nodeType, true);
			if(picName==null){
				picName = this.picSubThemeHaveChild;
			}
		}
		return picName;
	}
	
	/**
	 * 取叶子节点的图片
	 * @return String 叶子节点的图片名称
	 */
	private String getNodePicLeaf(String nodeType,boolean isLeaf){
		String picName = null;
		if(isLeaf){
			picName = getPicName(Tree_NodeType_Commen.Leaf.toString(), nodeType, false);
			if(picName==null){
				picName = this.picLeaf;
			}
		}else{
			picName = getPicName(Tree_NodeType_Commen.Leaf.toString(), nodeType, false);
			if(picName==null){
				picName = this.picLeaf;
			}
		}
		return picName;
	}
	
	/**
	 * 取默认图片
	 * @return String 默认图片图片名称
	 */
	private String getDefault(String operatorType,String nodeType,boolean isLeaf){
		String picName = null;
		if(isLeaf){
			picName = getPicName(operatorType, nodeType, false);
			if(picName==null){
				picName = this.picDefault;
			}
		}else{
			picName = getPicName(operatorType, nodeType, false);
			if(picName==null){
				picName = this.picDefault;
			}
		}
		return picName;
	}
	
	/**
	 * 取图片容器的Key键
	 * @param operatorType 节点操作类型
	 * @param nodeType 节点类型
	 * @param haveChild 是否有下级
	 * @return 返回图片容器的Key键
	 */
	private String getKey(String operatorType,String nodeType,boolean ishaveChild){
		if(TOOLS.StringIsEmpty(nodeType)){
			nodeType = null;
		}
		if(ishaveChild){
			return operatorType+"_"+nodeType+haveChild;
		}else{
			return operatorType+"_"+nodeType+notHaveChild;
		}
	}
	
	/**
	 * 查询是否根据nodeType方式设置了图片,有,取次图片,没有返回null
	 * @param operatorType 节点操作类型
	 * @param nodeType 节点类型
	 * @param isHaveChild 是否有下级节点
	 * @return 图片名称
	 */
	private String getPicName(String operatorType,String nodeType,boolean isHaveChild){
		
		String picName = null;
		if(TOOLS.StringIsEmpty(nodeType)){
			nodeType = null;
		}
		picName = this.picNames.getByKey(getKey(operatorType, nodeType, isHaveChild));
		if(TOOLS.StringIsEmpty(picName)){
			picName = this.picNames.getByKey(getKey(operatorType,null, isHaveChild));
		}
		return TOOLS.StringIsEmpty(picName)?null:picName;
	}
	
}
